package ws.very.util.lang
import scala.collection.mutable.Map
import reflect.{ ClassTag, classTag }
object SingleObj {
  private val objBox = Map[Class[_], Map[Any, Any]]()
  def apply[T: ClassTag](orCreate: => T, id: AnyRef = "Single") =
    synchronized {
      objBox.getOrElseUpdate(classTag[T].runtimeClass.getClass, Map()).getOrElseUpdate(id, { orCreate }).asInstanceOf[T]
    }

  /**
   * *
   *
   *
   * Scala 2.8规定在创建泛型数组Array[T]是必须得有T的运行时信息。所以对于上面的方法，我们需要将一个ClassManifest[T]类型作为隐式参数传入方法中：
   *
   * def tabulate[T](len: Int, f: Int=>T)(implicit m: ClassManifest[T]) = {
   * val xs = new Array[T](len)
   * for(i<-0 until len) xs(i) = f(i)
   * xs
   * }
   *
   * 你可能觉得这么些太长了，我们可以利用上下文绑定来简写上面的方法：
   *
   * def tabulate[T: ClassManifest](len: Int, f: Int=>T) = {
   * val xs = new Array[T](len)
   * for(i<-0 until len) xs(i) = f(i)
   * xs
   * }
   */
}